package org.foreveross.que.applicationImpl;

import org.foreveross.que.application.FbKeyApplication;
import org.foreveross.que.secret.SecretEncrypt;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.jws.WebService;

@Service
@WebService(serviceName = "FbKeyApplication", endpointInterface = "org.foreveross.que.application.FbKeyApplication")
public class FbKeyApplicationImpl implements FbKeyApplication {

	/**
	 * 获取跳转到问题反馈的url 后面加‘*’必填 
	 * 
	 * secretKey* 密钥 ,与问题反馈系统对应
	 * 
	 * feekBackUrl* 问题反馈根路径
	 * 
	 * domainName* 该系统域名
	 * 
	 * discussParentCode 讨论区父级讨论区代码
	 * 
	 * discussCode  进入讨论区代码（如果没有将创建讨论区）
	 * 
	 * discussName （如果新增讨论区为必填） 进入讨论区名称
	 * 
	 * availTime（如果，传递username时，为必填） 生成口令有效时间（毫秒）,口令生成后超过该设定时间，将无效，不能再通过该口令登录。
	 * 
	 * username 第三方系统用户名（如果没有将创建用户，密码默认）
	 */
	@Override
	public String getUrl(String secretKey,String feekBackUrl, String domainName,
			String discussParentCode, String discussCode, String discussName,
			String availTime, String username) throws Exception {
		String key = this.getInstantKey(secretKey, domainName, discussParentCode,
				discussCode, discussName, availTime, username);
		if(StringUtils.isBlank(feekBackUrl)){
			throw new Exception("问题反馈根路径");
		}
		if(StringUtils.isNotBlank(key)){
			if (StringUtils.indexOf(feekBackUrl,"?")==-1) {
				feekBackUrl += "?vo.sysType=" + domainName;
			} else {
				feekBackUrl += "&vo.sysType=" + domainName;
			}
		}
		feekBackUrl = this.loadParam(feekBackUrl, "key",key );
//		feekBackUrl = this.loadParam(feekBackUrl, "vo.sysType",domainName );
		return feekBackUrl;
	}

	/**
	 * 获取即时口令
	 * 
	 * secretKey* 密钥 ,与问题反馈系统对应
	 * 
	 * domainName* 该系统域名
	 * 
	 * discussParentCode 讨论区父级讨论区代码
	 * 
	 * discussCode  进入讨论区代码（如果没有将创建讨论区）
	 * 
	 * discussName （如果新增讨论区为必填） 进入讨论区名称
	 * 
	 * availTime（如果，传递username时，为必填） 生成口令有效时间（毫秒）,口令生成后超过该设定时间，将无效，不能再通过该口令登录。
	 * 
	 * username 第三方系统用户名（如果没有将创建用户，密码默认）
	 */
	private String getInstantKey(String secretKey, String domainName,
			String discussParentCode, String discussCode, String discussName,
			String availTime, String username) throws Exception {
			if (StringUtils.isBlank(secretKey)) {
				throw new Exception("密钥不能为空");
			}
			if(StringUtils.isBlank(domainName)){
				throw new Exception("domainName不能为空");
			}
//			String feekBackUrl = "";
//			if (feekBackUrl != null && !"".equals(feekBackUrl)) {
				String kouling = "";
				if (StringUtils.isNotBlank(username)) {
					if(StringUtils.isBlank(availTime)){
						throw new Exception("传递用户名【availTime】时，有效时间【availTime】不能为空");
					}
					kouling = this.loadParam(kouling, "username", username);
					kouling = this.loadParam(kouling, "requestTime", System.currentTimeMillis()+"");
					kouling = this.loadParam(kouling, "availTime", availTime);
				}
				kouling = this.loadParam(kouling, "mid",discussCode );
				kouling = this.loadParam(kouling, "pid", discussParentCode);
				kouling = this.loadParam(kouling, "discussName", discussName);
				kouling = SecretEncrypt.encrypt(secretKey, kouling);
				return kouling;
//				feekBackUrl = this.loadParam(feekBackUrl, "key",kouling );
//				feekBackUrl = this.loadParam(feekBackUrl, "vo.sysType",domainName );
//			}
//		return feekBackUrl;
	}
	
	/**
	 * 组装param
	 * @param paramsStr
	 * @param key
	 * @param value
	 * @return
	 */
	private String loadParam(String paramsStr,String key,String value){
		if(StringUtils.isNotBlank(value)){
			if (StringUtils.isBlank(paramsStr)) {
				paramsStr += ""+key+"=" + value;
			} else {
				paramsStr += "&"+key+"=" + value;
			}
		}
		return paramsStr;
	}
}
